/**
 * https://leetcode-cn.com/problems/permutations/
 * 全排列
 * @param nums 
 */
const permute = (nums: number[]): number[][] => {
    const ans: number[][] = []
    const len = nums.length;

    const cur: number[] = []

    // 存放已经选择的数字
    const bols: boolean[] = []
    /**
     * 
     * @param level 层数
     * @param num 当前选的数字
     */
    const dfs = (level: number) => {
        // 递归终止条件, 也是计算结果
        if (level > len) {
            ans.push([...cur])
            return;
        }

        /**
         * 遍历数组
         */
        for (const val of nums) {
            // 判断能否放入该数字
            if (!bols[val - 1]) {
                // 放入数组中
                cur.push(val);

                // 将该项置为true
                bols[val - 1] = true

                // 下一层
                dfs(level + 1)

                cur.pop()
                // 恢复
                bols[val - 1] = false
            }
        }
    }

    dfs(1)
    return ans;
};

permute([4, 2, 3]);